import 'dart:async';
import 'dart:typed_data';

import 'package:bluetooth_protocols_parser_plugin/library.dart';
import 'package:bluetooth_protocols_parser_plugin/src/enum/file_traversal_method.dart';
import 'package:bluetooth_protocols_plugin/library.dart';

import '../enum/open_file_type.dart';
import '../response/file_response.dart';
import '../response/response_data_base.dart';

typedef DataProcessor = Future<Uint8List> Function(Uint8List data);

// 等待用户操作回调, 通过complete回调传递用户操作结果
typedef WaitingUserActionCallback = void Function(
  UserActionType action,
  Function(bool) complete,
);

// 协议
abstract class Protocol<
    R_INFO extends RealtimeInfoBase,
    R_STATUS extends RealtimeStatusBase,
    R_ERROR extends RealtimeErrorBase,
    R_ALL extends RealtimeAllInfoBase,
    R_BATTERY extends RealtimeBatteryInfoBase,
    S_ONCE extends StatisticsOnceDataBase,
    S_TOTAL extends StatisticsTotalDataBase,
    SET extends SettingsBase,
    INTEGRATED_PRODUCT_INFO extends IntegratedProductionInfoBase,
    INTEGRATED_R_ALL extends IntegratedRealtimeInfoBase,
    RSP_DATA extends ResponseDataBase> {
  //
  //
  // 设置是否使用蓝牙发送
  setBluetoothSendMethod(bool status);

  // 设置HTTP发送消息回调
  void setHttpDataProcessor(DataProcessor onMessageHttpSent);

  // 订阅通知
  void listenBluetoothNotifyStream({
    // 回调NFC卡是否配对成功 - 适用Huari
    Function(RSP_DATA)? callbackNfcCardPairSuccess,
    // 回调车辆实时数据 - 适用Huari
    Function(R_INFO)? callbackRealtimeInfo,
    // 回调车辆实时状态 - 适用Lorin
    Function(INTEGRATED_R_ALL)? callbackRealtimeAllInfo,
  });

  // 取消订阅通知
  void cancelBluetoothNotifyStream();

  //
  // ------------- 共有协议 -------------
  // ------------- 共有协议 -------------

  // 获取sn
  Future<RSP_DATA> getSn();

  // 获取产品型号
  Future<RSP_DATA> getProductModel();

  // 写入激活时间
  Future<bool> writeActiveTime(Uint8List time);

  // 锁车/解锁
  Future<RSP_DATA> lock(Uint8List identifierBytes, [bool lock = true]);

  // 喇叭
  Future<bool> horn();

  // 灯光
  Future<bool> light({required bool lowBeam, required bool highBeam});

  // 设置骑行模式
  Future<bool> setRideMode(int mode);

  // 获取固件版本
  Future<List<Map<String, dynamic>>> getFirmwareVersion({int? targetDevice});

  // ------------- Huari 私有 -------------
  // ------------- Huari 私有 -------------

  // 获取身份认证随机码
  Future<RSP_DATA> getAuthRandomCode(Uint8List identifierBytes);

  // 写入产品型号
  Future<RSP_DATA> writeProductModel(Uint8List bytes);

  // 添加主密钥
  Future<RSP_DATA> addMasterKey(
    Uint8List identifierBytes,
    Uint8List masterKey,
  );

  // 删除主钥匙
  Future<RSP_DATA> deleteMasterKey();

  // 添加子密钥
  Future<RSP_DATA> addSubKey(
    Uint8List identifierBytes,
    Uint8List randomCode,
    Uint8List masterKey,
  );

  // 删除子钥匙
  Future<RSP_DATA> deleteSubKey(Uint8List identifierBytes);

  // 读取已经配对的钥匙
  Future<RSP_DATA> getKeyList();

  // 进入NFC配卡模式
  Future<RSP_DATA> enterNfcCardMode();

  // 退出NFC配卡模式
  Future<RSP_DATA> exitNfcCardMode();

  // 删除NFC卡
  Future<RSP_DATA> deleteNfcCard();

  // 验证加密随机数
  Future<RSP_DATA> verifyEncryptRandomNumber(Uint8List random);

  // 开启周期数据开关
  Future<bool> enablePeriodicDataSwitch(bool enable);

  // 读取控制数据
  Future<RSP_DATA> getControllerData(Uint8List addrBytes);

  // 设置控制数据
  Future<RSP_DATA> setControllerData(
    Uint8List addrBytes,
    Uint8List dataBytes,
  );

  // ------------- Lorin 私有协议 -------------
  // ------------- Lorin 私有协议 -------------

  // 建立安全连接
  Future<bool> buildSafeConnection();

  // 获取实时信息
  Future<R_INFO> getRealtimeInfo();

  // 实时状态
  Future<R_STATUS> getRealtimeStatus();

  // 实时错误
  Future<R_ERROR> getRealtimeError();

  // 综合实时信息
  Future<R_ALL> getRealtimeAll();

  // 电池实时信息
  Future<R_BATTERY> getRealtimeBatteryInfo();

  // 单次统计数据
  Future<S_ONCE> getStatisticOnce({int? startIndex, int? count});

  // 累计统计数据
  Future<S_TOTAL> getStatisticsTotal();

  // 综合设置
  Future<SET> getSettingsAll();

  // 设置待机时间
  Future<bool> setStandyTime(int time);

  // 获取综合产品信息
  Future<INTEGRATED_PRODUCT_INFO> getIntegratedProductInfo();

  // 获取综合实时信息
  Future<INTEGRATED_R_ALL> getIntegratedRealtimeInfoAll();

  // 设置周期数据上报间隔
  Future<bool> setPeriodicDataReportingInterval(int intervalSeconds);

  // 获取车辆昵称
  Future<String> getVehicleNickname();

  // 设置车辆昵称
  Future<bool> setVehicleNickname(String nickname);

  // 获取车辆密码
  Future<String> getVehiclePassword();

  // 设置车辆密码
  Future<bool> setVehiclePassword(String pwd);

  // 播放指定音频
  Future<bool> playSound(int audioIndex, {bool? play = true});

  // 设置限速
  Future<bool> setSpeedLimit(int speed);

  // 设置警报速度
  Future<bool> setWarningSpeed(int speed);

  // 设置骑行辅助开关
  Future<bool> setRideAssistSwitch(bool enabled);

  // 设置加、减速辅助百分比
  Future<bool> setAccAndBrakeAssistPercentage(
      int accPercentage, int brakePercentage);

  // 设置踏板灵敏度
  Future<bool> setPedalSensitivity(int sensitivity1, int sensitivity2);

  // 设置平衡角度
  Future<bool> setBalanceAngle(int angle);

  // 设置赛道倾斜角模式开关
  Future<bool> setBermAngleModeSwitch(bool enabled);

  // 防飞转
  Future<bool> setSpinKillSwitch(bool enabled);

  // 设置RTC时间
  Future<bool> setRtcTime(DateTime time);

  // 设置主声浪开关
  Future<bool> setMainSoundSwitch(bool enabled);

  // 设置语音开关
  Future<bool> setVoiceSwitch(bool enabled);

  // 设置音量
  Future<bool> setVolume(int volume);

  // 设置TBOX低电唤醒开关
  Future<bool> setTBoxLowBatteryWakeupSwitch(bool enabled);

  // 设置TBOX重启
  Future<bool> tBoxReboot();

  // 设置屏幕TBOX信息显示开关
  Future<bool> setTBoxInfoDisplaySwitch(bool enabled);

  // 设置运输模式开关
  Future<bool> setTransportModeSwitch(bool enabled);

  // 触发车辆平衡校正
  Future<bool> triggerVehicleCalibration(VehicleCalibrationType type);

  // 查询车辆平衡校正状态
  Future<VehicleCalibrationStatus> getVehicleCalibrationStatus(
      VehicleCalibrationType type);

  // 触发载重检测
  Future<bool> triggerLoadDetection();

  // 触发无载重检测
  Future<bool> triggerNoLoadDetection();

  // 设置自动大灯模式开关
  Future<bool> setAutoHeadlightModeSwitch(bool enabled);

  // 设置转向灯开关
  Future<bool> setTurnSignalLight({required bool left, required bool right});

  // 设置低电量骑行开关
  Future<bool> setLowBatteryRideSwitch(bool enabled);

  // 设置显示屏自动关闭开关
  Future<bool> setDisplayAutoOffSwitch(bool enabled);

  // 设置Logo灯亮度
  Future<bool> setLogoLightBrightness(int brightness);

  // 获取胎压传感器信息
  Future<RSP_DATA> getTirePressureSensorInfo();

  // 清除搜索到的胎压传感器信息
  Future<bool> clearSearchedTirePressureSensorInfo();

  // 设置胎压低报警阈值
  Future<bool> setTirePressureLowAlarmThreshold(int threshold);

  // 日行灯开关
  Future<bool> setDaytimeRunningLightSwitch(bool enabled);

  // 显示屏进入升级状态
  Future<bool> displayEnterUpgradeStatus(bool enable);

  // 显示屏进入文件传输状态
  Future<bool> displayEnterFileTransferStatus(bool enable);

  // 开始电机自适应流程（主动调整驱动参数以适配负载或摩擦）的命令标识符。
  Future<bool> startMotorAdaptation();

  // 查询电机自适应状态的命令标识符（例如是否正在适配、适配进度或结果）。
  Future<MotorAutoStatus> getMotorAdaptationStatus();

  // 停止正在进行的电机自适应流程的命令标识符。
  Future<bool> stopMotorAdaptation();

  // 清除电机自适应（摩擦/偏差）相关存储数据的命令标识符。
  Future<bool> clearMotorAdaptationData();

  // 启动电机自检（硬件/传感器/驱动器自检）流程的命令标识符。
  Future<bool> startMotorSelfCheck();

  // 获取电机自检结果的命令标识符。
  Future<RSP_DATA> getMotorSelfCheckResult();

  // 开始电池电压校准流程的命令标识符。
  Future<bool> startBatteryVoltageCalibration();

  // MARK: - 固件升级 & 文件操作
  Future<void> startOTA(
    TargetDeviceType targetDeviceType,
    String localFirmwareUrl,
    String newVersion,
    TotalSizeCallback? onTotalSize,
    ProgressCallback onProgress,
    OtaStatusCallback onStatus,
    WaitingUserActionCallback onUserActionRequired, {
    required int maxPacketSize,
  });

  // 停止固件升级
  Future<void> stopOTA(TargetDeviceType targetDeviceType);

  // 查询固件升级状态
  Future<FirmwareUpgradeStatus> queryFirmwareUpdateStatus(
      TargetDeviceType targetDeviceType);

  // 开始固件升级
  Future<bool> startFirmwareUpdate(TargetDeviceType targetDeviceType,
      {bool isStart = true});

  // 查询强制固件升级状态
  Future<FirmwareForceUpgradeStatus> queryForceFirmwareUpdateStatus(
      {TargetDeviceType? targetDeviceType});

  // 清除强制固件升级状态
  Future<bool> clearForceFirmwareUpdateStatus(
      {TargetDeviceType? targetDeviceType});

  // 开始强制固件升级
  Future<bool> startForceFirmwareUpdate(TargetDeviceType targetDeviceType,
      FirmwareForceUpgradeStatus type, int lowVersion, int highVersion);

  /// 打开文件
  /// [type] 文件打开方式
  /// [path] 文件路径
  Future<OpenFileResponse> openFile(
      TargetDeviceType targetDeviceType, OpenFileType type, String path);

  /// 读文件
  /// [handle] 文件句柄
  /// [offset] 偏移位置
  /// [length] 读取长度
  Future<ReadFileResponse> readFile(
    TargetDeviceType targetDeviceType,
    int handle,
    int offset,
    int length,
  );

  /// 写文件
  /// [handle] 文件句柄
  /// [offset] 偏移位置
  /// [data] 写入数据
  Future<WriteFileResponse> writeFile(
    TargetDeviceType targetDeviceType,
    int handle,
    int offset,
    Uint8List data,
  );

  /// 校验读文件
  /// [handle] 文件句柄
  /// [offset] 偏移位置
  Future<VerifyReadFileResponse> verifyReadFile(
      TargetDeviceType targetDeviceType, int handle, int offset);

  /// 校验写文件
  /// [handle] 文件句柄
  /// [fileSize] 文件大小（写时必填）
  /// [offset] 偏移位置
  /// [crc32] 文件校验码（写时必填）
  Future<VerifyWriteFileResponse> verifyWriteFile(
      TargetDeviceType targetDeviceType,
      int handle,
      int fileSize,
      int offset,
      int crc32);

  /// 关闭文件（终止下载）
  /// [handle] 文件句柄
  Future<CloseFileResponse> closeFile(
      TargetDeviceType targetDeviceType, int handle);

  /// 读取文件信息
  /// [path] 文件路径
  Future<ReadFileInfoResponse> readFileInfo(
      TargetDeviceType targetDeviceType, String path);

  /// 删除文件
  /// [path] 文件路径
  Future<DeleteFileResponse> deleteFile(
      TargetDeviceType targetDeviceType, String path);

  /// 重命名文件
  /// [oldPath] 旧文件路径
  /// [newPath] 新文件路径
  Future<RenameFileResponse> renameFile(
      TargetDeviceType targetDeviceType, String oldPath, String newPath);

  /// 获取文件列表
  /// [index] 请求序号
  /// [method] 遍历方式
  /// [depth] 遍历深度
  /// [path] 目录路径
  /// [name] 文件名过滤
  Future<GetFileListResponse> getFileList(
    TargetDeviceType targetDeviceType,
    int index,
    FileTraversalMethod method,
    FileTraversalDepth depth,
    String path,
    String name,
  );
}
